
#include <iostream>
#include <systemc>
#include <vector>
#include <cstdlib>
#include <ctime>

#include "network_node.h"
#include "monitor_node.h"

int sc_main(int argc, char** argv)
{   

    if (argc < 3)
    {
        std::cout << "Usage : " << argv[0] << " modeling_time(us) error_peobability" << std::endl;
        return -1;
    }


    int modeling_time = atoi(argv[1]);
    double p = atof(argv[2]);    
    network_channel::set_error_probability(p);
    
    // Инициализация генератора сл.чисел
    std::srand(std::time(NULL));   
   
    //
    // Создание сети
    //
    
    // Число узлов     
    const int NODES_COUNT = 10;    
    
    // Каналы передачи данных
    
    std::vector<network_channel *> wire;
    wire.resize(NODES_COUNT);
    
    for (std::size_t i=0; i<NODES_COUNT; ++i)
    {
        char ch_name_buf[32];
        std::sprintf(ch_name_buf, "ch_%d", i);
        wire[i] = new network_channel(ch_name_buf);
    }
    
    // Узлы сети    
    std::vector<network_node *> nodes;    
    nodes.resize(NODES_COUNT);

    // один из узлов - активный монитор (генерирует маркер)
    nodes[0] = new monitor_node("monitor");
    
    for (std::size_t i=1; i<NODES_COUNT; ++i)
    {        
        char node_name_buf[32];
        std::sprintf(node_name_buf, "node_%d", i);
        nodes[i] = new network_node(node_name_buf, network_node::next_address());
    }
            
    // Соединение станций в кольцо
    
    nodes[0]->in(*wire[0]);
    nodes[NODES_COUNT-1]->out(*wire[0]);
    for (std::size_t i=1; i<NODES_COUNT; ++i)    
    {
        nodes[i-1]->out(*wire[i]);
        nodes[i]->in(*wire[i]);            
    }
                  
    // Запуск моделирования
    sc_core::sc_start(modeling_time, sc_core::SC_US);       
    
    return 0;
}


